package com.dzsw.e2p.util;

import com.itextpdf.text.Document;
import com.itextpdf.text.Phrase;
import com.itextpdf.text.pdf.PdfPCell;
import com.itextpdf.text.pdf.PdfPTable;
import com.itextpdf.text.pdf.PdfWriter;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

import java.io.FileInputStream;
import java.io.FileOutputStream;

public class Excel2PDF {

    public static void main(String[] args) {
        String input = "C:\\Users\\SyDevuser36\\Downloads\\Shipping Schedule.xlsx";
        String output = "D:\\output.pdf";
        try {
            // 读取 Excel 文件
            FileInputStream excelFile = new FileInputStream(input);
            Workbook workbook = new XSSFWorkbook(excelFile);
            Sheet sheet = workbook.getSheetAt(0);

            // 创建 PDF 文档
            Document document = new Document();
            PdfWriter.getInstance(document, new FileOutputStream(output));
            document.open();

            // 创建 PDF 表格，列数与 Excel 表格的列数相同
            int columnCount = sheet.getRow(0).getLastCellNum();
            PdfPTable pdfTable = new PdfPTable(columnCount);

            // 遍历 Excel 表格的每一行
            for (Row row : sheet) {
                // 遍历当前行的每一个单元格
                for (Cell cell : row) {
                    // 获取单元格的值
                    String cellValue = getCellValueAsString(cell);
                    // 创建 PDF 表格的单元格
                    PdfPCell pdfCell = new PdfPCell(new Phrase(cellValue));
                    // 将单元格添加到 PDF 表格中
                    pdfTable.addCell(pdfCell);
                }
            }

            // 将 PDF 表格添加到 PDF 文档中
            document.add(pdfTable);

            // 关闭文档和 Excel 文件
            document.close();
            workbook.close();
            excelFile.close();

            System.out.println("Excel 转 PDF 成功！");
        } catch (Exception e) {
            e.printStackTrace();
            System.out.println("Excel 转 PDF 失败：" + e.getMessage());
        }
    }

    // 将单元格的值转换为字符串
    private static String getCellValueAsString(Cell cell) {
        if (cell == null) {
            return "";
        }
        switch (cell.getCellType()) {
            case STRING:
                return cell.getStringCellValue();
            case NUMERIC:
                if (DateUtil.isCellDateFormatted(cell)) {
                    return cell.getDateCellValue().toString();
                } else {
                    return String.valueOf(cell.getNumericCellValue());
                }
            case BOOLEAN:
                return String.valueOf(cell.getBooleanCellValue());
            case FORMULA:
                return cell.getCellFormula();
            default:
                return "";
        }
    }

}
